#include "dialogimpl.h"
#include "fehlermsgimpl.h"


//
DialogImpl::DialogImpl( QWidget * parent, Qt::WindowFlags f) 
	: QDialog(parent, f)
{
	setupUi(this);
	labelLoeschen -> setVisible(false);
	LCDAnzahlDateienLoeschen -> setVisible(false);

	this -> setWindowTitle("qMediaCopy v0.7.1");
	
	//verbinde signal timer timeout mit slot
	connect(&timer, SIGNAL( timeout() ), this, SLOT( Slot_timer_timeout() ));
		
	//Einstellungen lesen
	QString s;
	QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
	qDebug() << "Pfad Einstellungen:" << einstellungen.fileName();
	
	//source Pfad
	bool ok = einstellungen.contains("Pfade/src");
	s = einstellungen.value("Pfade/src").toString();
	if (ok)
		labelSrc -> setText(s);
	else {
		einstellungen.setValue("Pfade/src",QDir::homePath());
		labelSrc -> setText(QDir::homePath());
	}
		
	//dest Pfad Bilder
	ok = einstellungen.contains("Pfade/Bilderdst");
	s = einstellungen.value("Pfade/Bilderdst").toString();
	if (ok)
		labelBilderDst -> setText(s);
	else {
		einstellungen.setValue("Pfade/Bilderdst",QDir::homePath());
		labelBilderDst -> setText(QDir::homePath());
	}
		
	//dest Pfad Filme
	ok = einstellungen.contains("Pfade/Filmedst");
	s = einstellungen.value("Pfade/Filmedst").toString();
	if (ok)
		labelFilmeDst -> setText(s);
	else {
		einstellungen.setValue("Pfade/Filmedst",QDir::homePath());
		labelFilmeDst -> setText(QDir::homePath());
	}
	
	//in unterordner Einsortieren
	bool b = einstellungen.value("Optionen/UnterordnerDatum").toBool();
	if (b)
		checkBoxDatumsOrdner -> setCheckState(Qt::Checked);
	else
		checkBoxDatumsOrdner -> setCheckState(Qt::Unchecked);
	
	//Nach dem Kopieren Beenden
	b = einstellungen.value("Optionen/Beenden").toBool();
	if (b)
		checkBoxBeenden -> setCheckState(Qt::Checked);
	else
		checkBoxBeenden -> setCheckState(Qt::Unchecked);

	//Bildvorschau aktiv
	b = einstellungen.value("Optionen/Bildvorschau").toBool();
	if (b)
		checkBoxBildvorschau -> setCheckState(Qt::Checked);
	else
		checkBoxBildvorschau -> setCheckState(Qt::Unchecked);

	//Globale Einstellungen
	QSettings GlobaleEinstellungen(QSettings::IniFormat, QSettings::SystemScope, "Gremmelsoft", "qmediacopy");
	qDebug() << "Pfad Globale Einstellungen:" << GlobaleEinstellungen.fileName();
	//Bildname
	ok = GlobaleEinstellungen.contains("Bilder/Name");
	s = GlobaleEinstellungen.value("Bilder/Name").toString();
	if (ok)
		editBildname -> setText(s);
	else {
		GlobaleEinstellungen.setValue("Bilder/Name","Bild");
		editBildname -> setText("Bild");
	}
	//Bildnummer
	ok = GlobaleEinstellungen.contains("Bilder/Nummer");
	int i = GlobaleEinstellungen.value("Bilder/Nummer").toInt();
	if (ok)
		spinBoxBildnummer -> setValue(i);
	else {
		GlobaleEinstellungen.setValue("Bilder/Nummer",0);
		spinBoxBildnummer -> setValue(0);
	}
	//Film
	ok = GlobaleEinstellungen.contains("Filme/Name");
	s = GlobaleEinstellungen.value("Filme/Name").toString();
	if (ok)
		editFilmname -> setText(s);
	else {
		GlobaleEinstellungen.setValue("Filme/Name","Film");
		editFilmname -> setText("Film");
	}
	//Filmnummer
	ok = GlobaleEinstellungen.contains("Filme/Nummer");
	i = GlobaleEinstellungen.value("Filme/Nummer").toInt();
	if (ok)
		spinBoxFilmnummer -> setValue(i);
	else {
		GlobaleEinstellungen.setValue("Filme/Nummer",0);
		spinBoxFilmnummer -> setValue(0);
	}
	
	buttonKopieren->setEnabled(false);
	buttonVerschieben->setEnabled(false);

	//verbinde signale von Kopie Thread
	connect(&KThread, SIGNAL( finished() ), this, SLOT( Slot_KopieThread_finished() ));
	connect(&KThread, SIGNAL( Sig_Fehler(QString) ), this, SLOT( Slot_KThread_Fehler(QString) ));
	connect(&KThread, SIGNAL( Sig_BildKopiert(QString, QString, QImage) ), this, SLOT( Slot_KThread_BildKopiert(QString, QString, QImage) ));
	connect(&KThread, SIGNAL( Sig_FilmKopiert(QString, QString) ), this, SLOT( Slot_KThread_FilmKopiert(QString, QString) ));
	connect(&KThread, SIGNAL( Sig_DateiGeloescht(QString, QString) ), this, SLOT( Slot_KThread_DateiGeloescht(QString, QString) ));
	
	DateilisteEinlesen();
}
//


void DialogImpl::on_buttonSrc_clicked()
{
	QString s = QFileDialog::getExistingDirectory(
		this,
		qApp->translate("Bitte Verzeichniss auswaehlen","Bitte Verzeichniss auswählen"),
		labelSrc->text(),
		QFileDialog::ShowDirsOnly );
		
	if (s != ""){
		labelSrc->setText(s);
		QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
		einstellungen.setValue("Pfade/src",s);
	}
	if (!KThread.isRunning()){
		DateilisteEinlesen();
	}
	else {
		//wenn Thread mit Dateiliste einlesen beschäftigt ist
		if (KThread.getAction() == 1){
			//unterbrechen und anschliessendes Dateiliste Einlesen anfordern
			KThread.stop(101);
		}
	}
}

void DialogImpl::DateilisteEinlesen()
{
	//Nichts unternehmen wenn Thread noch zu tun hat.
	if (!KThread.isRunning()){
		labelBild -> clear();
		buttonKopieren->setEnabled(false);
		buttonVerschieben->setEnabled(false);
		progressBar -> setMinimum(0);
		progressBar -> setMaximum(0);
		KThread.setPfadSrc(labelSrc -> text());
		qDebug() << "Aktion setzen das Dateiliste eingelesen werden soll";
		//Aktion setzen das Dateiliste eingelesen werden soll
		KThread.setAction(1);
		KThread.start();
		timer.start(500);
		qDebug() << "Dialog ist gestartet";
	}
}

void DialogImpl::on_buttonAktualisieren_clicked()
{
	DateilisteEinlesen();
}

void DialogImpl::on_buttonBilderDst_clicked()
{
	QString s = QFileDialog::getExistingDirectory(
		this,
		qApp->translate("Bitte Verzeichniss auswaehlen","Bitte Verzeichniss auswaehlen"),
		labelBilderDst->text(),
		QFileDialog::ShowDirsOnly );
		
	if (s != ""){
		labelBilderDst->setText(s);
		QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
		einstellungen.setValue("Pfade/Bilderdst",s);
	}
}

void DialogImpl::on_buttonFilmeDst_clicked()
{
	QString s = QFileDialog::getExistingDirectory(
		this,
		qApp->translate("Bitte Verzeichniss auswaehlen","Bitte Verzeichniss auswaehlen"),
		labelFilmeDst->text(),
		QFileDialog::ShowDirsOnly );
		
	if (s != ""){
		labelFilmeDst->setText(s);
		QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
		einstellungen.setValue("Pfade/Filmedst",s);
	}
}

void DialogImpl::on_editBildname_editingFinished()
{
	if (editBildname -> text() == "")
		editBildname -> setText("Bild");
	//Bildname in Globale Einstellungen schreiben
	QSettings GlobaleEinstellungen(QSettings::IniFormat, QSettings::SystemScope, "Gremmelsoft", "qmediacopy");
	GlobaleEinstellungen.setValue("Bilder/Name",editBildname -> text());
}

void DialogImpl::on_editBildname_textChanged(QString )
{
}

void DialogImpl::on_editFilmname_editingFinished()
{
	if (editFilmname -> text() == "")
		editFilmname -> setText("Film");
	//Bildname in Globale Einstellungen schreiben
	QSettings GlobaleEinstellungen(QSettings::IniFormat, QSettings::SystemScope, "Gremmelsoft", "qmediacopy");
	GlobaleEinstellungen.setValue("Filme/Name",editFilmname -> text());
}

void DialogImpl::on_spinBoxBildnummer_editingFinished()
{
	QSettings GlobaleEinstellungen(QSettings::IniFormat, QSettings::SystemScope, "Gremmelsoft", "qmediacopy");
	GlobaleEinstellungen.setValue("Bilder/Nummer",spinBoxBildnummer -> value());
}

void DialogImpl::on_spinBoxFilmnummer_editingFinished()
{
	QSettings GlobaleEinstellungen(QSettings::IniFormat, QSettings::SystemScope, "Gremmelsoft", "qmediacopy");
	GlobaleEinstellungen.setValue("Filme/Nummer",spinBoxFilmnummer -> value());
}

void DialogImpl::on_checkBoxDatumsOrdner_clicked(bool checked)
{
	QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
	einstellungen.setValue("Optionen/UnterordnerDatum",checked);
}

void DialogImpl::on_checkBoxBeenden_clicked(bool checked)
{
	QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
	einstellungen.setValue("Optionen/Beenden",checked);
}

bool DialogImpl::DateienKopieren(bool verschieben)
{
	if (!KThread.isRunning()){
		buttonKopieren -> setEnabled(false);
		buttonVerschieben -> setEnabled(false);
	
		//setzte Bildpfad dest
		KThread.setPfadBilderDst(labelBilderDst -> text());
		//setzte Bildnummer
		KThread.setBildnummer(spinBoxBildnummer->value());
		//Unterordner mit Datum erstellen
		KThread.setDatumsOrdner(checkBoxDatumsOrdner->isChecked());
		//Bildname
		KThread.setBildname(editBildname->text());
		//setzte Fimpfad dest
		KThread.setPfadFilmeDst(labelFilmeDst -> text());
		//setzte Filmnummer
		KThread.setFilmnummer(spinBoxFilmnummer->value());
		//setzte Filmname
		KThread.setFilmname(editFilmname->text());
		//Bildvorschaugrösse
		KThread.setBildvorschauGroesse(QSize(labelBild -> width()-6,labelBild -> height()-6));
	
		if (verschieben){
			//verschieben
			KThread.setAction(3);
		}
		else {
			//kopieren
			KThread.setAction(2);
		}
		qDebug() << "Kopieren / Verschieben starten";
		KThread.start();
	}
	
	return true;
}


void DialogImpl::on_buttonKopieren_clicked()
{
	DateienKopieren(false);
}

void DialogImpl::on_buttonVerschieben_clicked()
{
	DateienKopieren(true);
}

void DialogImpl::on_checkBoxBildvorschau_clicked(bool checked)
{
	QSettings einstellungen(QSettings::IniFormat, QSettings::UserScope, "Gremmelsoft", "qmediacopy");
	einstellungen.setValue("Optionen/Bildvorschau",checked);
	KThread.setBildvorschau(checked);
}

void DialogImpl::Slot_KopieThread_finished()
{
	qDebug() << "Thread ist fertig";
	timer.stop();
	//wenn aktion "Dateiliste Einlesen war"
	if (KThread.getAction() == 1){
		qDebug() << "Dateiliste Einlesen fertig";
		LCDAnzahlDateienBilder -> display(int(KThread.getBilderCount()));
		LCDAnzahlDateienFilme -> display(int(KThread.getFilmeCount()));
		LCDAnzahlDateienLoeschen -> display(int(KThread.getLoeschenCount()));
		if (KThread.getLoeschenCount() == 0){
			LCDAnzahlDateienLoeschen -> setVisible(false);
			labelLoeschen -> setVisible(false);
		}
		else {
			LCDAnzahlDateienLoeschen -> setVisible(true);
			labelLoeschen -> setVisible(true);
		}
		if (KThread.isEmpty()){
			buttonKopieren->setEnabled(false);
			buttonVerschieben->setEnabled(false);
			progressBar -> setMaximum(100);
		}
		else {
			buttonKopieren->setEnabled(true);
			buttonVerschieben->setEnabled(true);
			progressBar -> setMaximum(KThread.getGesammtCount());
		}
		progressBar -> setValue(0);
	}
	//Kopieren oder Verschieben ist fertig
	else if ((KThread.getAction() == 2) | (KThread.getAction() == 3) ){
		spinBoxBildnummer -> setValue(KThread.getBildnummer());
		spinBoxFilmnummer -> setValue(KThread.getFilmnummer());
		//Aktuelle Bildnummer speichern
		on_spinBoxBildnummer_editingFinished();
		//Aktuelle Filmnummer speichern
		on_spinBoxFilmnummer_editingFinished();
		labelZeit -> setText("Restzeit");
		//wenn angewählt Programm jetzt beenden
		if (checkBoxBeenden->isChecked())
			close();
	}
	//anwendung Beenden
	else if (KThread.getAction() == 100){
		qDebug() << "Anwendung beenden anforderung aus Thread";
		close();
	}
	//Dateiliste neu Einlesen starten
	else if (KThread.getAction() == 101){
		qDebug() << "Dateiliste neu Einlesen anforderung aus Thread";
		DateilisteEinlesen();
	}
}


void DialogImpl::closeEvent(QCloseEvent *event)
{
	//nicht beenden wenn Thread noch aktiv ist und Dateien Kopiert verschoben werden
	if (KThread.isRunning()){
		//Thread stoppen mit Anschliesendem Beenden
		qDebug() << "Thread stoppen mit Anschliesendem Beenden";
		KThread.stop(100);
		event->ignore();
	}
}


void DialogImpl::Slot_timer_timeout()
{
	if (KThread.getAction() == 1){
		LCDAnzahlDateienBilder -> display(int(KThread.getBilderCount()));
		LCDAnzahlDateienFilme -> display(int(KThread.getFilmeCount()));
		LCDAnzahlDateienLoeschen -> display(int(KThread.getLoeschenCount()));
		labelBild -> setText("Durchsuche Verzeichniss Nr. " + QString::number(KThread.getZaehler()));
	}
}


void DialogImpl::Slot_KThread_BildKopiert(QString datei, QString restzeit, const QImage &image)
{
	progressBar -> setValue(progressBar -> value() + 1);
	LCDAnzahlDateienBilder -> display(int(LCDAnzahlDateienBilder -> value()-1));
	labelZeit -> setText(restzeit);
	//Bildvorschau laden wenn aktiv
	if (checkBoxBildvorschau -> isChecked()){
		datei = datei;
		//QApplication::processEvents();
		labelBild -> setPixmap(QPixmap::fromImage(image));
	}
}


void DialogImpl::Slot_KThread_FilmKopiert(QString datei, QString restzeit)
{
	//nur wegen der compilerwarnung
	datei = datei;
	progressBar -> setValue(progressBar -> value() + 1);
	labelZeit -> setText(restzeit);
	LCDAnzahlDateienFilme -> display(int(LCDAnzahlDateienFilme -> value()-1));
}

void DialogImpl::Slot_KThread_DateiGeloescht(QString datei, QString restzeit)
{
	//nur wegen der compilerwarnung
	datei = datei;
	progressBar -> setValue(progressBar -> value() + 1);
	labelZeit -> setText(restzeit);
	LCDAnzahlDateienLoeschen -> display(int(LCDAnzahlDateienLoeschen -> value()-1));
}


void DialogImpl::Slot_KThread_Fehler(QString fehlerliste)
{
	fehlerMsgImpl fmsg;
	fmsg.setText(fehlerliste);
	fmsg.exec();
}

